#include "headfile.h"

/*********************************************************************************************************************
 * @file       		GlobalVar.c
 * @brief      		定义各种全局变量、宏定义及结构体
 * @note
 * 
 ********************************************************************************************************************/





//==================舵机====================
int SteerDuty=INITDUTY;		//舵机打角占空比
int SteerError=0;			//舵机误差
int8 g_steer_open=0;			//舵机开关标志
int SteerDutySet=INITDUTY;	//舵机关闭时手动设置舵机的角度
// STEER steerC={0,0,0,0,0};	//舵机控制使用的结构体
float p_max = 1.40;			//舵机动态P_MAX
float p_min = 2.53;			//舵机动态P_MIN
int Error_1=0;          //舵机偏差1
int Error_2=0;          //舵机偏差2
float Steer_P=2;         //舵机控制的P
float Steer_P_CI= 1.25;		//环岛p
float Steer_D=1;        //舵机PID的D
// float Steer_P_Ramp = 1.25;              //坡道p
// float Steer_P_Cross = 0.9;              //大环p
// float Steer_D1 = 4.25;     //入弯D
// float Steer_D2 = -4.25;     //出弯D
int ControlMid=MID; //控制中点

// int MaxSteerDuty5 = 0;  //环岛状态5舵机最大值

//==================键盘、液晶====================
char g_Key = -1;//键盘按键值



//==================电机、速度控制====================
int rCurSpeed=0;		//右轮速度
int lCurSpeed=0;		//左轮速度
float leftExpect=0;		//左轮期望速度
float rightExpect=0;	//右轮期望速度
int CurSpeed=0;			//速度
int speed_type=0;		//用于选择速度的类型
int leftSpeedOut=0;		//左轮最终输出速度
int rightSpeedOut=0;	//右轮最终输出速度

int spdExp = 0;        //最终期望速度
const int spdExp0 = 0;	        //停车速度
int spdExp1 = 15;		//平跑速度,15,公式：现=原*50
int spdExp2 = 10;		//电磁基准速度
// int spdExp3 = 8;		//过弯速度（大）,8
// int spdExp4=6;		//射击速度，6
// int spdExp5=8;		//环岛速度 8
int spdExp6=0;			//上位机速度
char test_flag=0;
int spdExp7=5;			//识别速度 10


int spdBas1 = 15;		//平跑基准速度,15
int spdBas2 = 10;		//电磁基准速度
// int spdBas3 = 8;		//过弯速度（大),8
// int spdBas4=6;			//射击速度，6

float speed_k1=0.25;            //changespeed_flag函数参数1
float speed_k2=0.012;           //changespeed_flag函数参数2

//---速度控制----
int KDet=10;			//差速计算参数
// float In_kdet=8;		//入库差速
// float Cir_kdet=0;		//环岛差速
// float Cross_kdet=0;		//大环差速
float g_speed_p=520;		//速度控制的P
float g_speed_i=20;		//速度控制的I
float g_speed_d=0;		//速度控制的D
// float Ramp_Speed_P=520;	//坡道速度控制的P
// float Ramp_Speed_I=20;	//坡道速度控制的I
// float RamP_Speed_D=0;	//坡道速度控制的D
SPEED leftDrv={0,0,0,0,0};		//左轮速度类型PID
SPEED rightDrv={0,0,0,0,0};		//右轮速度类型PID

char g_drive_flag=0;		//电机启动标志，0关闭，1启动

int SpeedRow = 0;			//控速边界行数


//==================控制====================
// int8 Stop_Flag=0;//停车标志，0=不停车，1=需要停车
// int8 Ramp_Open=0;//坡道开关，0=关，1=开
// int8 Garage_State=G_OFF;	//车库状态，0=关闭，1=出库,2=入库

//==================补图====================
//-----Flags----
int8 g_handle_open=0;				//补图开关 0=关，1=开
int8 g_camera_open=1;				//摄像头开关，0=关，1=开
// int8 Img_StopLineFlag=0;		//图像判断停车线标志，0=无，1=有
// int8 Cross_Flag=0;				//大弯标志
int8 CircleFlag=0;				//环岛标志
int8 Img_RampFlag=0;			//坡道标志(0:无)
int8 g_RoadType = 0;			//赛道情况
// int8 Img_SpecialElemFlag = 0;    //特殊元素标志
// int8 Garage_Open=0;				//车库开关
int8 ErrorFlag=0;               //补图错标志，0=正常
//-----叫啥我也没想好----
int ProSpect=45;				//前瞻行
int ML_Count=45;				//中线有效行
int LeftIntLine = 0;		//记录左内跳行数
int RightIntLine = 0;		//记录右内跳行数
//----补图参数----
int8 FindLineType = 0;							//是否加入高光滤波标志


//----canny变量----
int HighThreshold = 50;						//canny高阈值，50,40
int LowThreshold = 20;						//canny低阈值，20,16
int LightThreshold = 80;						//去高光噪声阈值

//----阈值----
int BrightThreshold = 15;                      //亮阈值（坡道）

//----摄像头硬件参数----
int exp_time=300;	//摄像头曝光设置
uint8 (*image)[IMG_COL];	//摄像头数据接收
uint8 ImageEdge[IMG_ROW][IMG_COL]; 	//摄像头边缘判断数组
int ML[IMG_ROW]={0},LL[IMG_ROW]={0},RL[IMG_ROW]={0};//三线数组

const int MidOffset[] = {
	 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 11, 12, 13, 14, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 52, 53, 54, 55, 56, 57, 58, 59, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93,
};


//------点信息-------
SpecialPoint LeftPnt, RightPnt;					//保存左右特殊点信息


//---环岛----
int8 CircleState=0;				//环岛状态
int8 Img_CircleOpen=1;          //图像处理环岛开关

//---三叉---
char Forks_State = 0;			//三叉状态 详见Forks.cpp
char Forks_Direct = FN;			//三叉方向
char Circle_Again_Flag = 0;		//圈数
char Dist_ClearFork5Flag=0;		//延距清三岔5标志
char FD_Now=FN;	
char FD_Ready_Flag=0;
char FD_Clear_Flag=0;
char getA_Flag = 0, getB_Flag = 0,getC_Flag=0;
char FD_WaitFlag=0;
char Dist_Forks3Flag=0;	//延距清三叉2->3标志

// int8 CircleFlagSet = 1;          //手动设置环岛方向

// int8 LeftLost = 0, RightLost = 0;
// int8 ChangeFlag = 0;
int8 Img_SpecialElemFlag=0;     //特殊元素开关
//==================================刹车=================//
int g_stop_line = 0;
int g_stop_dis = 0;
int times_go = 0;
int times_stop = 0;
int rount = 1;          //圈数
int DistantStop = 0;		//累计编码器脉冲

float Distance = 30;   //测量距离
int8 Img_StopOpen=0;            //停车入库开关
int8 Img_StopLineFlag=0;        //检测停车线开关
int8 Get_StopLine=0;            //检测到停车线标志
//==================惯性导航====================
// int Navagition_Dir = 0;                 //0不出库，1左，2右

int8 Dist_ClearSevenFlag=0;         //延距清环岛7状态


//==================任务====================
// int8 Shoot_Flag=0;//射击标志，0=不射击，1=需要射击
// int8 SlowDown_Flag=0;//减速识别标志，0=不需要减速，1=需要减速


//==================电磁====================
int ind_left=0;	//左电感值
int ind_mid=0;//中电感值
int ind_right=0;//右电感值


char protect_flag=0;        //电磁的保护标记（用于速度计算）
//===================================================================================================================

